#ifndef _MAP_H_
#define _MAP_H_

#include <vector>
#include <map>
#include <string>

#include "layer.h"
#include "Tile.h"
#include "Object.h"

/**
  * @brief Orientation des cartes TMX
  */
enum TmxOrientation {
    ORTHOGONAL, ISOMETRIC, HEXAGONAL
};

/**
  * @class Map
  * @brief Stockage des informations d'une carte TMX
  */
class Map {
private :
	std::vector<Object> _objects ;
    std::map<int, Tile> _ressources ;
    std::map<std::string, std::string> _properties ;
    std::vector<Layer> _layers ;

    int _width ;
    int _height ;
    int _version ;
    int _tileWidth ;
    int _tileHeight ;
    TmxOrientation _orientation ;
public :
    /**
      * @brief Constructeur
      *
      * Construit une carte vide
      */
    Map() ;
    /**
      * @brief Chargement d'une carte TMX
      *
      * @param fileName : Chemin du fichier TMX
      */
    void loadFromFile(const std::string& fileName) ;
    /**
      * @brief Version de la carte TMX
      *
      * @return La version de la carte.
      */
    int version() const ;
    /**
      * @brief Largeur de la carte TMX, en nombre de cases
      *
      * @return La largeur de la carte.
      */
    int width() const ;
    /**
      * @brief Hauteur de la carte TMX, en nombre de cases
      *
      * @return La hauteur de la carte.
      */
    int height() const ;
    /**
      * @brief Largeur d'une case de la carte TMX, en pixel
      *
      * @return La largeur d'une case.
      */
    int tileWidth() const ;
    /**
      * @brief Hauteur d'une case de la carte TMX, en pixel
      *
      * @return La hauteur d'une case.
      */
    int tileHeight() const ;
    /**
      * @brief Orientation de la carte
      *
      * @return L'orientation de la carte
      */
    TmxOrientation orientation() const ;
    /**
      * @brief Calques (Layers) de la carte
      *
      * @return Un vecteur de layers
      */
	const std::vector<Layer>& layers() const ;
    /**
      * @brief Objets (Objects) de la carte
      *
      * @return Un vecteur d' objects
      */
	const std::vector<Object>& objects() const ;
    /**
      * @brief Ressources (Tiles) de la carte
      *
      * @return Une std::map dont les clés sont les gid des ressources,
      *         et les valeurs les Tiles associés.
      */
	const std::map<int, Tile>& ressources() const ;
    /**
      * @brief Proprietes de la carte
      *
      * @return Une std::map dont les clés sont les noms des proprietes,
      *         et les valeurs les valeurs de ces proprietes.
      */
	const std::map<std::string, std::string>& properties() const ;
    /**
      * @brief AJout d'un calque
      *
      * @param l : Calque à ajouter
      */
    void addLayer(Layer l) ;
};

#endif // _MAP_H_
